import wx
#coding UTF-8
from socket import  socket,AF_INET,SOCK_STREAM

class YsJClient(wx.Frame):
    def __init__(self, client_name):
        #调用父类的初始化方法
        #None:表示没有父级窗口
        #id 表示窗口编号
        #pos  窗体打开的位置
        #size 窗体的大小，单位像素
        wx.Frame.__init__(self,None, id=1001, title=client_name + '的客户端界面',pos=wx.DefaultPosition, size=(400, 450))
        #创建面板对象
        pl = wx.Panel(self)
        #面板中放盒子
        box = wx.BoxSizer(wx.VERTICAL)
        # 可伸缩的网格布局
        fgz1 = wx.FlexGridSizer(wx.HSCROLL)
        # 水平方向布局

        # 创建两个按钮
        conn_btn = wx.Button(parent=pl, size=(200, 40), label='连接')
        dis_conn_btn = wx.Button(parent=pl, size=(200, 40), label='断开')

        # 把两个按钮放到可伸缩的网格布局
        fgz1.Add(conn_btn, 1, wx.TOP | wx.LEFT)
        fgz1.Add(dis_conn_btn, 1, wx.TOP | wx.RIGHT)

        # (可伸缩的网络布局)添加到box中
        box.Add(fgz1, 1, wx.ALIGN_CENTRE)

        #只读文本框
        self.show_text=wx.TextCtrl(pl,size=(400,210),style=wx.TE_MULTILINE|wx.TE_READONLY)
        box.Add(self.show_text,1,wx.ALIGN_CENTRE)

        #创建聊天文本框
        self.chat_text = wx.TextCtrl(pl, size=(400, 120), style=wx.TE_MULTILINE)
        box.Add(self.chat_text, 1, wx.ALIGN_CENTRE)

        #可绳索网格布局
        fgz1 = wx.FlexGridSizer(wx.HSCROLL)

        #两个按钮
        reset_btn = wx.Button(parent=pl, size=(200, 40), label='重置')
        send_btn = wx.Button(parent=pl, size=(200, 40), label='发送')
        fgz1.Add(reset_btn, 1, wx.TOP | wx.LEFT)
        fgz1.Add(send_btn, 1, wx.TOP | wx.RIGHT)

        # (可伸缩的网络布局)添加到box中
        box.Add(fgz1, 1, wx.ALIGN_CENTRE)

        pl.SetSizer(box)


        '--------客户端界面绘制--------'
        self.Bind(wx.EVT_BUTTON, self.connect_to_server, conn_btn)
        self.client_name=client_name
        self.isConnected=False
        self.client_socket=None
        #发送绑定
        self.Bind(wx.EVT_BUTTON, self.send_to_server, send_btn)
        #断开绑定
        self.Bind(wx.EVT_BUTTON, self.dis_conn_to_server, dis_conn_btn)
        # 重置绑定
        self.Bind(wx.EVT_BUTTON, self.reset, reset_btn)
    def reset(self,event):
        self.chat_text.Clear()

    def dis_conn_to_server(self,event):
        self.client_socket.send('Y-disconnect-SJ'.encode('utf-8'))
        self.isconnected=False

    def send_to_server (self,event):
        if self.isConnected:
            input_data=self.chat_text.GetValue()
            if input_data!='':
                self.client_socket.send(input_data.encode('utf-8'))
                self.chat_text.SetValue('')


    def connect_to_server(self, event):
        print(f'客户端{self.client_name}连接服务器成功')
        if not self.isConnected:
            server_host_port=('127.0.0.1',8888)
            #创建socket对象
            self.client_socket=socket(AF_INET,SOCK_STREAM)
            #发送请求
            self.client_socket.connect(server_host_port)
            import threading
            # 只要连接成功，发送一条数据
            self.client_socket.send(self.client_name.encode('utf-8'))
            # 启动一个线程，客户端的线程与服务器的会话线程进行会话
            client_thread = threading.Thread(target=self.recv_data)
            # 设置成守护线程， 窗体关掉，子线程也结束了
            client_thread.daemon = True
            # 修改一下连接状态
            self.isConnected = True
            # 启动线程
            client_thread.start()
    def recv_data(self):
        while self.isConnected:
            data=self.client_socket.recv(1024).decode('utf-8')
            # 只读文本框
            self.show_text.AppendText('-' * 40 + '\n' + data + '\n')


        '-----------服务器功能------'
if __name__ == '__main__':
    app=wx.App()
    name=input('请输入客户端名称')
    client =YsJClient(name)

    client.Show()
    app.MainLoop()





